package pe.edu.unmsm.fisi.sysllabus.presentacion.controller.procesos;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;

import org.primefaces.event.SelectEvent;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CarreraProfesionalDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CronogramaAcademicoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoCronogramaDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoGrupoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.DocenteDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.PlanEstPeriodoAcademicoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.PlanEstudioDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.CarreraService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.CronogramaAcademicoService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.CursoService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.DocenteService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.PlanEstPeriodoAcademicoService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.PlanEstudioService;

@Controller
@Scope("view")
public class ProcInitCronoController {

	/****************ATRIBUTOS***************/
	private List<CronogramaAcademicoDTO> listCronogramas;
	private Integer anio;
	private List<CarreraProfesionalDTO> carreras;
	private CronogramaAcademicoDTO cronogramaSeleccionado;
	private CronogramaAcademicoDTO cronogramaEditar;
	private Integer tabActivo;
	private List<PlanEstudioDTO> planesEstudios;
	private List<PlanEstPeriodoAcademicoDTO> periodoAcads;
	private Integer idPlanEstSeleccionado;
	private PlanEstudioDTO planEstudioSeleccionado;
	private List<CursoDTO> cursos;
	private Integer idPerAcadSeleccionado;
	private PlanEstPeriodoAcademicoDTO periodoAcadSeleccionado;
	private CursoDTO[] cursosSeleccionados;
	private CursoCronogramaDTO cursoCroSeleccionado;
	private CursoCronogramaDTO cursoCroSeleccionadoEl;
	private CursoCronogramaDTO cursoCroEditar;
	private CursoGrupoDTO grupoEdSeleccionado;
	private CursoGrupoDTO grupoEditar;
	private List<DocenteDTO> docentes;
	private boolean eliminarHabilitado;
	@Resource
	CronogramaAcademicoService cronogramaService;
	@Resource
	CarreraService carreraService;
	@Resource
	PlanEstudioService planEstudioService;
	@Resource
	PlanEstPeriodoAcademicoService planAcademicoService;
	@Resource
	CursoService cursoService;
	@Resource
	DocenteService docenteService;

	/**************INICIALIZACION*************************/
	public ProcInitCronoController() {
		setAnio(2013);
		setCronogramaEditar(new CronogramaAcademicoDTO());
		getCronogramaEditar().setCursosCronograma(new ArrayList());
		setTabActivo(0);
		setPlanesEstudios(new ArrayList<PlanEstudioDTO>());
		setIdPlanEstSeleccionado(null);
		setIdPerAcadSeleccionado(null);
		setCursos(new ArrayList<CursoDTO>());
		setCursosSeleccionados(null);
		setPlanEstudioSeleccionado(new PlanEstudioDTO());
		setPeriodoAcadSeleccionado(new PlanEstPeriodoAcademicoDTO());
		setGrupoEditar(new CursoGrupoDTO());
		getGrupoEditar().setDocente(new DocenteDTO());
		setEliminarHabilitado(false);
	}
	
	@PostConstruct
	private void init(){
		setListCronogramas(cronogramaService.listarCronogramasxAnio(getAnio()));
		setCarreras(carreraService.listarCarreras());
	}
	
	/****************NAVEGACION*******************/
	public void nuevoCronograma(ActionEvent ev){
		System.out.println("entro a nuevo cronorgrama");
		setCronogramaEditar(new CronogramaAcademicoDTO());
		getCronogramaEditar().setCursosCronograma(new ArrayList());
		setPlanesEstudios(new ArrayList<PlanEstudioDTO>());
		setPeriodoAcads(new ArrayList<PlanEstPeriodoAcademicoDTO>());
		setCursos(new ArrayList<CursoDTO>());
	}
	public void editarCronograma(SelectEvent sev){
		setCronogramaEditar(cronogramaService.obtenerCronogramaAcademico(getCronogramaSeleccionado().getIdCronogramaAcademico()));
		setPlanesEstudios(planEstudioService.listarPlanesEstudioPorCarrera(getCronogramaEditar().getIdCarreraProfesional()));
		setPeriodoAcads(null);
		setTabActivo(1);
	}
	
	public void guardarCronograma(ActionEvent ev){
		cronogramaService.guardarCronograma(getCronogramaEditar());
		nuevoCronograma(ev);
		setListCronogramas(cronogramaService.listarCronogramasxAnio(getAnio()));
		setCarreras(carreraService.listarCarreras());
	}
	
	public void listarPlanesEstudios(AjaxBehaviorEvent aev){
		setPlanesEstudios(planEstudioService.listarPlanesEstudioPorCarrera(getCronogramaEditar().getIdCarreraProfesional()));
		setPeriodoAcads(null);
	}
	public void listarPeriodosAcads(AjaxBehaviorEvent aev){
		setPlanEstudioSeleccionado(planEstudioService.obtenerPlanEstudio(getIdPlanEstSeleccionado()));
		setPeriodoAcads(planAcademicoService.listarPeriodosAcademicosxPlan(getIdPlanEstSeleccionado()));
	}
	public void listarCursos(AjaxBehaviorEvent aev){
		setCursos(cursoService.listarCursosxPeriodo(getIdPerAcadSeleccionado()));
	}
	public void anadirCursosSeleccionados(ActionEvent ev){
		setPeriodoAcadSeleccionado(planAcademicoService.obtenerPeriodoAcadxPlan(getIdPerAcadSeleccionado()));
		for (CursoDTO cursoDTO : cursosSeleccionados) {
			boolean existeCurso=false;
			for (CursoCronogramaDTO cursoCro : getCronogramaEditar().getCursosCronograma()) {
				if(cursoCro.getCurso().getIdCurso().equals(cursoDTO.getIdCurso()))
					existeCurso=true;
			}
			if (!existeCurso) {
				CursoCronogramaDTO curCro=new CursoCronogramaDTO();
				curCro.setGrupos(new ArrayList<CursoGrupoDTO>());
				curCro.setCurso(cursoService.obtenerCurso(cursoDTO.getIdCurso()));
				curCro.setIdCronograma(getCronogramaEditar().getIdCronogramaAcademico());
				
				CursoGrupoDTO curGrupo=new CursoGrupoDTO();
				curGrupo.setDocente(new DocenteDTO());
				curGrupo.setNomGrupo("Seccion 1");
				curCro.getGrupos().add(curGrupo);
				getCronogramaEditar().getCursosCronograma().add(curCro);				
			}
		}
	}
	
	public void editarGrupos(){
		setEliminarHabilitado(false);
		setCursoCroEditar(new CursoCronogramaDTO());
		setGrupoEditar(new CursoGrupoDTO());
		getGrupoEditar().setDocente(new DocenteDTO());
		for (int i = 0; i < getCronogramaEditar().getCursosCronograma().size(); i++) {
			if(getCronogramaEditar().getCursosCronograma().get(i).getCurso().getIdCurso().equals(getCursoCroSeleccionado().getCurso().getIdCurso()))
				setCursoCroEditar(getCronogramaEditar().getCursosCronograma().get(i));
		}
	}
	
	public void editarGrupo(SelectEvent sev){
		setEliminarHabilitado(true);
		for (CursoGrupoDTO grupo : getCursoCroEditar().getGrupos()) {
			if(grupo.getNomGrupo().equals(getGrupoEdSeleccionado().getNomGrupo()))
				editarGrupoSeleccionado(grupo);
		}
	}
	
	private void editarGrupoSeleccionado(CursoGrupoDTO grupo){
		setGrupoEditar(new CursoGrupoDTO());
		getGrupoEditar().setDocente(new DocenteDTO());
		getGrupoEditar().getDocente().setIdDocente(grupo.getDocente().getIdDocente());
		getGrupoEditar().getDocente().setNomDocente(grupo.getDocente().getNomDocente());
		getGrupoEditar().setNomGrupo(grupo.getNomGrupo());
	}
	
	public void nuevoGrupo(ActionEvent ev){
		setEliminarHabilitado(false);
		setGrupoEditar(new CursoGrupoDTO());
		getGrupoEditar().setDocente(new DocenteDTO());		
	}
	
	public List<String> autoCompletarDocente(String query){
		setDocentes(docenteService.listarDocentesxNombre(query));
		List<String> strDocentes = new ArrayList<String>();
		for (int i = 0; i < getDocentes().size(); i++)
			strDocentes.add(getDocentes().get(i).getNomDocente());
		return strDocentes;
	}
	
	public void asignarIdDocente(SelectEvent sev){
		for (int i = 0; i < getDocentes().size(); i++)
		{
			if(getGrupoEditar().getDocente().getNomDocente().equals(getDocentes().get(i).getNomDocente()))
				getGrupoEditar().getDocente().setIdDocente(getDocentes().get(i).getIdDocente());
		}
	}
	public void guardarGrupo(ActionEvent ev){
		boolean existeGrupo=false;
		for(int i = 0; i < getCursoCroEditar().getGrupos().size(); i++){
			if(getCursoCroEditar().getGrupos().get(i).getNomGrupo().equals(getGrupoEditar().getNomGrupo()))
			{
				existeGrupo=true;
				getCursoCroEditar().getGrupos().get(i).setNomGrupo(getGrupoEditar().getNomGrupo());
				getCursoCroEditar().getGrupos().get(i).getDocente().setIdDocente(getGrupoEditar().getDocente().getIdDocente());
				getCursoCroEditar().getGrupos().get(i).getDocente().setNomDocente(getGrupoEditar().getDocente().getNomDocente());
			}
				
		}
		if(!existeGrupo)
			getCursoCroEditar().getGrupos().add(grupoEditar);
		nuevoGrupo(ev);
	}
	
	public void eliminarGrupo(ActionEvent ev){
		setEliminarHabilitado(false);
		for (int i = 0; i < getCursoCroEditar().getGrupos().size(); i++) {
			if(getCursoCroEditar().getGrupos().get(i).getNomGrupo().equals(getGrupoEditar().getNomGrupo()))
				getCursoCroEditar().getGrupos().remove(i);
		}
	}
	
	public void eliminarCursoCro(){
		System.out.println("cursocro eliminado :"+getCursoCroSeleccionadoEl().getCurso().getIdCurso());
		for (int i = 0; i < getCronogramaEditar().getCursosCronograma().size(); i++) {
			if(getCronogramaEditar().getCursosCronograma().get(i).getCurso().getIdCurso().equals(getCursoCroSeleccionadoEl().getCurso().getIdCurso()))
				getCronogramaEditar().getCursosCronograma().remove(i);
		}
	}
	/**************GETTERS AND SETTERS*********************/
	public List<CronogramaAcademicoDTO> getListCronogramas() {
		return listCronogramas;
	}

	public void setListCronogramas(List<CronogramaAcademicoDTO> listCronogramas) {
		this.listCronogramas = listCronogramas;
	}

	public Integer getAnio() {
		return anio;
	}

	public void setAnio(Integer anio) {
		this.anio = anio;
	}

	public List<CarreraProfesionalDTO> getCarreras() {
		return carreras;
	}

	public void setCarreras(List<CarreraProfesionalDTO> carreras) {
		this.carreras = carreras;
	}

	public CronogramaAcademicoDTO getCronogramaSeleccionado() {
		return cronogramaSeleccionado;
	}

	public void setCronogramaSeleccionado(CronogramaAcademicoDTO cronogramaSeleccionado) {
		this.cronogramaSeleccionado = cronogramaSeleccionado;
	}

	public CronogramaAcademicoDTO getCronogramaEditar() {
		return cronogramaEditar;
	}

	public void setCronogramaEditar(CronogramaAcademicoDTO cronogramaEditar) {
		this.cronogramaEditar = cronogramaEditar;
	}

	public Integer getTabActivo() {
		return tabActivo;
	}

	public void setTabActivo(Integer tabActivo) {
		this.tabActivo = tabActivo;
	}

	public List<PlanEstudioDTO> getPlanesEstudios() {
		return planesEstudios;
	}

	public void setPlanesEstudios(List<PlanEstudioDTO> planesEstudios) {
		this.planesEstudios = planesEstudios;
	}

	public List<PlanEstPeriodoAcademicoDTO> getPeriodoAcads() {
		return periodoAcads;
	}

	public void setPeriodoAcads(List<PlanEstPeriodoAcademicoDTO> periodoAcads) {
		this.periodoAcads = periodoAcads;
	}

	public Integer getIdPlanEstSeleccionado() {
		return idPlanEstSeleccionado;
	}

	public void setIdPlanEstSeleccionado(Integer idPlanEstSeleccionado) {
		this.idPlanEstSeleccionado = idPlanEstSeleccionado;
	}

	public List<CursoDTO> getCursos() {
		return cursos;
	}

	public void setCursos(List<CursoDTO> cursos) {
		this.cursos = cursos;
	}

	public Integer getIdPerAcadSeleccionado() {
		return idPerAcadSeleccionado;
	}

	public void setIdPerAcadSeleccionado(Integer idPerAcadSeleccionado) {
		this.idPerAcadSeleccionado = idPerAcadSeleccionado;
	}

	public CursoDTO[] getCursosSeleccionados() {
		return cursosSeleccionados;
	}

	public void setCursosSeleccionados(CursoDTO[] cursosSeleccionados) {
		this.cursosSeleccionados = cursosSeleccionados;
	}

	public PlanEstudioDTO getPlanEstudioSeleccionado() {
		return planEstudioSeleccionado;
	}

	public void setPlanEstudioSeleccionado(PlanEstudioDTO planEstudioSeleccionado) {
		this.planEstudioSeleccionado = planEstudioSeleccionado;
	}

	public PlanEstPeriodoAcademicoDTO getPeriodoAcadSeleccionado() {
		return periodoAcadSeleccionado;
	}

	public void setPeriodoAcadSeleccionado(PlanEstPeriodoAcademicoDTO periodoAcadSeleccionado) {
		this.periodoAcadSeleccionado = periodoAcadSeleccionado;
	}

	public CursoCronogramaDTO getCursoCroSeleccionado() {
		return cursoCroSeleccionado;
	}

	public void setCursoCroSeleccionado(CursoCronogramaDTO cursoCroSeleccionado) {
		this.cursoCroSeleccionado = cursoCroSeleccionado;
	}

	public CursoCronogramaDTO getCursoCroEditar() {
		return cursoCroEditar;
	}

	public void setCursoCroEditar(CursoCronogramaDTO cursoCroEditar) {
		this.cursoCroEditar = cursoCroEditar;
	}

	public CursoGrupoDTO getGrupoEdSeleccionado() {
		return grupoEdSeleccionado;
	}

	public void setGrupoEdSeleccionado(CursoGrupoDTO grupoEdSeleccionado) {
		this.grupoEdSeleccionado = grupoEdSeleccionado;
	}

	public CursoGrupoDTO getGrupoEditar() {
		return grupoEditar;
	}

	public void setGrupoEditar(CursoGrupoDTO grupoEditar) {
		this.grupoEditar = grupoEditar;
	}

	public List<DocenteDTO> getDocentes() {
		return docentes;
	}

	public void setDocentes(List<DocenteDTO> docentes) {
		this.docentes = docentes;
	}

	public boolean isEliminarHabilitado() {
		return eliminarHabilitado;
	}

	public void setEliminarHabilitado(boolean eliminarHabilitado) {
		this.eliminarHabilitado = eliminarHabilitado;
	}

	public CursoCronogramaDTO getCursoCroSeleccionadoEl() {
		return cursoCroSeleccionadoEl;
	}

	public void setCursoCroSeleccionadoEl(CursoCronogramaDTO cursoCroSeleccionadoEl) {
		this.cursoCroSeleccionadoEl = cursoCroSeleccionadoEl;
	}
}
